Delaware income tax#
Delaware has a single core rate structure that does not vary by filing status. It also has other exemptions, deductions, and credits, including a two-tier federal Earned Income Tax Credit match: filers can claim either a refundable or non-refundable EITC match, but not both.
Examples#
Full income tax#
from policyengine_us import IndividualSim
import pandas as pd
import plotly.express as px
LIGHT_GRAY = "#F5F5F5"
GRAY = "#BDBDBD"
BLUE = "#5091cc"
LIGHT_BLUE = "lightblue"
DARK_BLUE = "darkblue"
COLOR_MAP = {"0": GRAY, "1": LIGHT_BLUE, "2": BLUE, "3": DARK_BLUE}
def make_tax(adults, children):
sim = IndividualSim(year=2023)
sim.add_person(name="head", age=25, rent=12_000)
members = ["head"]
if adults == 2:
sim.add_person(name="spouse")
members += ["spouse"]
for i in range(children):
child = "child{}".format(i)
sim.add_person(name=child, age=6)
members += [child]
sim.add_tax_unit(name="tax_unit", members=members)
sim.add_spm_unit(name="spm_unit", members=members)
sim.add_household(name="household", members=members, state_code="DE")
sim.vary("employment_income", max=100_000, step=100)
return pd.DataFrame(
dict(
employment_income=sim.calc("employment_income")[0],
de_income_tax=sim.calc("de_income_tax")[0].round(),
de_eitc=sim.calc("de_eitc")[0].round(),
de_refundable_eitc=sim.calc("de_refundable_eitc")[0].round(),
de_non_refundable_eitc=sim.calc("de_non_refundable_eitc")[
0
].round(),
mtr=sim.deriv(
"de_income_tax", "employment_income", wrt_target="head"
),
adults=adults,
children=str(children),
)
)
# Make a table of state taxes for different numbers of adults and children.
l = []
for adults in range(1, 3):
for children in range(0, 4):
l.append(make_tax(adults, children))
df = pd.concat(l)
LABELS = dict(
employment_income="Employment income",
de_income_tax="Delaware income tax",
mtr="State marginal tax rate",
adults="Adults",
children="Children",
de_eitc="Delaware EITC",
de_refundable_eitc="Delaware refundable EITC",
de_non_refundable_eitc="Delaware non-refundable EITC",
)
fig = px.line(
df,
"employment_income",
"de_income_tax",
color="children",
animation_frame="adults",
labels=LABELS,
title="Delaware state income tax",
color_discrete_map=COLOR_MAP,
)
fig.update_layout(
xaxis_tickformat="$,",
yaxis_tickformat="$,",
plot_bgcolor="white",
xaxis_gridcolor=LIGHT_GRAY,
yaxis_gridcolor=LIGHT_GRAY,
)
fig.show()
Core marginal tax rates span from zero to five percent, but when including the EITC, they range from -13.5% to 12.3%, depending on income and household structure.
fig = px.line(
df,
"employment_income",
"mtr",
color="children",
animation_frame="adults",
labels=LABELS,
title="Delaware state income tax marginal tax rate",
color_discrete_map=COLOR_MAP,
)
fig.update_layout(
xaxis_tickformat="$,",
yaxis_tickformat=".1%",
plot_bgcolor="white",
xaxis_gridcolor=LIGHT_GRAY,
yaxis_gridcolor=LIGHT_GRAY,
)
fig.show()
df
| employment_income | de_income_tax | de_eitc | de_refundable_eitc | de_non_refundable_eitc | mtr | adults | children | |
|---|---|---|---|---|---|---|---|---|
| 0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | -0.003443 | 1 | 0 |
| 1 | 100.0 | -0.0 | 0.0 | 0.0 | 0.0 | -0.003443 | 1 | 0 |
| 2 | 200.0 | -1.0 | 1.0 | 1.0 | 0.0 | -0.003443 | 1 | 0 |
| 3 | 300.0 | -1.0 | 1.0 | 1.0 | 0.0 | -0.003442 | 1 | 0 |
| 4 | 400.0 | -1.0 | 1.0 | 1.0 | 0.0 | -0.003443 | 1 | 0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 996 | 99600.0 | 4578.0 | 0.0 | 0.0 | 0.0 | 0.066001 | 2 | 3 |
| 997 | 99700.0 | 4585.0 | 0.0 | 0.0 | 0.0 | 0.065996 | 2 | 3 |
| 998 | 99800.0 | 4591.0 | 0.0 | 0.0 | 0.0 | 0.066001 | 2 | 3 |
| 999 | 99900.0 | 4598.0 | 0.0 | 0.0 | 0.0 | 0.066001 | 2 | 3 |
| 1000 | 100000.0 | 4604.0 | 0.0 | 0.0 | 0.0 | 0.066001 | 2 | 3 |
8008 rows × 8 columns
Delaware EITC#
Massachusetts matches 30 percent of a filer’s federal Earned Income Tax Credit.
fig = px.line(
# Filter to single person with no children
df[(df.adults == 1) & (df.children == "3")],
"employment_income",
["de_refundable_eitc", "de_non_refundable_eitc"],
labels=LABELS,
title="Delaware EITC for a single person with no children",
color_discrete_map=COLOR_MAP,
)
fig.update_layout(
xaxis_tickformat="$,",
yaxis_tickformat="$,",
plot_bgcolor="white",
xaxis_gridcolor=LIGHT_GRAY,
yaxis_gridcolor=LIGHT_GRAY,
)
fig.show()
Massachusetts Limited Income Credit#
See Schedule NTS-L-NR/PY No Tax Status and Limited Income Credit.
fig = px.line(
df,
"employment_income",
"ma_limited_income_tax_credit",
color="children",
animation_frame="adults",
labels=LABELS,
title="Massachusetts Limited Income Credit",
color_discrete_map=COLOR_MAP,
)
fig.update_layout(
xaxis_tickformat="$,",
yaxis_tickformat="$,",
yaxis_range=[0, df.ma_limited_income_tax_credit.max()],
plot_bgcolor="white",
xaxis_gridcolor=LIGHT_GRAY,
yaxis_gridcolor=LIGHT_GRAY,
)
set_bounds(fig, df.employment_income, df.ma_limited_income_tax_credit)
fig.show()
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/tmp/ipykernel_2976/1981194212.py in <cell line: 1>()
----> 1 fig = px.line(
2 df,
3 "employment_income",
4 "ma_limited_income_tax_credit",
5 color="children",
/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/plotly/express/_chart_types.py in line(data_frame, x, y, line_group, color, line_dash, symbol, hover_name, hover_data, custom_data, text, facet_row, facet_col, facet_col_wrap, facet_row_spacing, facet_col_spacing, error_x, error_x_minus, error_y, error_y_minus, animation_frame, animation_group, category_orders, labels, orientation, color_discrete_sequence, color_discrete_map, line_dash_sequence, line_dash_map, symbol_sequence, symbol_map, markers, log_x, log_y, range_x, range_y, line_shape, render_mode, title, template, width, height)
262 a polyline mark in 2D space.
263 """
--> 264 return make_figure(args=locals(), constructor=go.Scatter)
265
266
/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/plotly/express/_core.py in make_figure(args, constructor, trace_patch, layout_patch)
2088 apply_default_cascade(args)
2089
-> 2090 args = build_dataframe(args, constructor)
2091 if constructor in [go.Treemap, go.Sunburst, go.Icicle] and args["path"] is not None:
2092 args = process_dataframe_hierarchy(args)
/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/plotly/express/_core.py in build_dataframe(args, constructor)
1490 # now that things have been prepped, we do the systematic rewriting of `args`
1491
-> 1492 df_output, wide_id_vars = process_args_into_dataframe(
1493 args, wide_mode, var_name, value_name
1494 )
/opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/plotly/express/_core.py in process_args_into_dataframe(args, wide_mode, var_name, value_name)
1211 if argument == "index":
1212 err_msg += "\n To use the index, pass it in directly as `df.index`."
-> 1213 raise ValueError(err_msg)
1214 elif length and len(df_input[argument]) != length:
1215 raise ValueError(
ValueError: Value of 'y' is not the name of a column in 'data_frame'. Expected one of ['employment_income', 'de_income_tax', 'de_eitc', 'de_refundable_eitc', 'de_non_refundable_eitc', 'mtr', 'adults', 'children'] but received: ma_limited_income_tax_credit